package simple;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Consumer {
    public static void main(String[] args) throws IOException, TimeoutException {
        //1. 创建连接
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("162.14.99.141");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        connectionFactory.setVirtualHost("ty");
        Connection connection = connectionFactory.newConnection();
        //2. 创建Channel
        Channel channel = connection.createChannel();
        //3. 声明队列
        channel.queueDeclare("queue1", true, false, false, null);
        //4. 消费信息

        DefaultConsumer consumer = new DefaultConsumer(channel) {
            /**
             * void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
             * 定义如何处理接收到的消息，接收到消息时会自动 调用该方法
             * 参数说明
             * consumerTag: 消费者标签，消费者的唯一标识符，由 RabbitMQ 服务器分配，用于区分同一个连接中的不同消费者。
             * envelope: 描述：消息的信封，包含消息的路由元数据，主要属性有：
                         getDeliveryTag()：消息的投递标签（用于确认消息）。
                         getExchange()：消息发布到的交换机名称。
                         getRoutingKey()：消息的路由键。
                         isRedeliver()：标识消息是否为重新投递（如之前未确认）。
             * properties: 消息的属性，包含可选的用户定义元数据（如消息头、内容类型、优先级等）。常见属性有：
                           getContentType()：消息内容的 MIME 类型（如application/json）。
                           getHeaders()：自定义键值对头部信息。
                           getCorrelationId()：用于关联请求和响应的 ID。
                           getReplyTo()：回调队列名称（用于请求 - 响应模式）。
             * body: 消息的具体内容
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("接收到：" + new String(body));
            }
        };
        //simple.Consumer 用于定义消费者的行为，从RabbitMQ接收消息时，需要提供一个实现了Consumer接口的对象
        //DefaultConsumer是RabbitMQ提供的一个默认消费者，实现了Consumer接口
        /**
         * String basicConsume(String queue, boolean autoAck, simple.Consumer callback);
         * 参数说明
         * queue: 消费的队列的名称
         * autoAck: 是否要自动确认
         * callback: 接收到消息后的执行逻辑
         */
        channel.basicConsume("queue1", true, consumer);

        //5. 释放资源
//        channel.close();
//        connection.close();
    }
}
